home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Aminet 2
/
Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso
/
Aminet
/
gfx
/
misc
/
lise20.lha
/
lise2.0
/
mdl
/
src
/
mdllibUX.c
< prev
next >
Wrap
C/C++ Source or Header
|
1993-03-31
|
19KB
|
710 lines
/* {(rm mdllib.o ; cc -DUNIX -c -s -n -O -Wc,-Nd4000 -Wc,-Ns4000 -Wc,-Nt50000 -DSYSV -DNLS16 -Dhp9000s300 -o mdllib.o mdllib.c)& } */
/**---------------------------------------------------------------------
***
*** file: mdl.c
***
*** project: Menu Description Language
*** General purpose Menu generator.
***
*** (c) 1990 Rainer Kowallik
***
***-------------------------------------------------------------------*/
/* include files */
#include <stdio.h>
#include <setjmp.h>
#include <X11/Intrinsic.h>
#include <X11/IntrinsicP.h>
#include <X11/CoreP.h>
#include <X11/Shell.h>
#include <Xm/Xm.h>
#include <Xm/BulletinB.h>
#include <Xm/CascadeB.h>
#include <Xm/Frame.h>
#include <Xm/Label.h>
#include <Xm/MainW.h>
#include <Xm/MessageB.h>
#include <Xm/PushB.h>
#include <Xm/PushBG.h>
#include <Xm/RowColumn.h>
#include <Xm/ScrollBar.h>
#include <Xm/ScrolledW.h>
#include <Xm/ToggleBG.h>
#include <Xm/Scale.h>
#include <Xm/SelectioB.h>
#define PUSH 1
#define TOGGLE 2
#define SCALEX 3
#define SCALEY 4
#define DIALOG 5
#define MENU 6
#define NEW_MENU 7
#define FILE_SELECT 8
#define BOARD 9
#define BULLETIN 10
#define SELECTION 11
#define MESSAGE 12
#define RADIO 13
#define ROWCOL 14
#define SCALEX11 15
#define SCALEY11 16
#define STRING 17
#define INTEGER 18
#define FLOAT 19
/* functions defined in this program */
/* void main(); */
void activateCB(); /* Callback for the PushButton */
/* global variables */
Display *display = NULL; /* dsplay */
XtAppContext app_context = NULL; /* Application Context */
Widget app_shell = NULL; /* shell widget */
Widget main_window = NULL; /* MainWindow */
Widget menu_bar = NULL; /* MenuBar */
Widget menu_pane = NULL; /* MenuPane */
Widget cascade = NULL; /* CascadeButton */
Widget frame = NULL; /* Frame */
Widget swindow = NULL; /* ScrolledWindow */
Widget row_column = NULL; /* RowColumn */
Widget button = NULL; /* PushButtonGadget */
Widget hsb = NULL;
Widget vsb = NULL; /* ScrollBars */
Widget radio = NULL; /* Radio button Widget */
Widget dialog_box = NULL;
int last_gadgetid = 0;
int fn_number = 0;
void (*fn_command[160])();
int *var_value[160];
int var_funct[160];
Widget Wstring[160];
int string_var[160];
int string_ptr = 0;
Widget Wtoggle[160];
int toggle_var[160];
int toggle_ptr = 0;
Widget Wscale[160];
int scale_var[160];
int scale_ptr = 0;
int selector[160];
int selector_ptr = 0;
int acc_x = 0; /* accumulated x */
int acc_y = 0; /* accumulated y */
int bas_y = 5; /* base scale for y-increment */
char menu_name[80]; /* store menu bar name */
char return_string[80]; /* string returned from dialog box */
char resource[80];
jmp_buf ugly;
/* -------------------------------------------------------------
The following variables and functions are declared for AMIGA
compatibility. They should get more usefull in future releases
------------------------------------------------------------- */
int propdwn;
int menu_line;
int menu_column;
int top_slider;
int scale_var0[160];
int scale_var1[160];
int fin_flg; /* tells the MainLoop to termitate */
read_dir(s1,s2)
char *s1, *s2;
{
return(0);
}
/* --------------------------------------------------------------
Create default application windows and widgets
-------------------------------------------------------------- */
Widget CreateApplication (parent)
Widget parent; /* parent widget */
{
Arg args[10]; /* arg list */
register int n; /* arg count */
/* Create MainWindow.
*/
n = 0;
main_window = XmCreateMainWindow (parent, "main1", args, n);
XtManageChild (main_window);
/* Create MenuBar in MainWindow.
*/
n = 0;
menu_bar = XmCreateMenuBar (main_window, "menu_bar", args, n);
XtManageChild (menu_bar);
/* Create Frame MainWindow and ScrolledWindow in Frame.
*/
n = 0;
XtSetArg (args[n], XmNmarginWidth, 2); n++;
XtSetArg (args[n], XmNmarginHeight, 2); n++;
XtSetArg (args[n], XmNshadowThickness, 1); n++;
XtSetArg (args[n], XmNshadowType, XmSHADOW_OUT); n++;
frame = XmCreateFrame (main_window, "frame", args, n);
XtManageChild (frame);
n = 0;
XtSetArg (args[n], XmNscrollBarDisplayPolicy, XmAS_NEEDED); n++;
XtSetArg (args[n], XmNscrollingPolicy, XmAUTOMATIC); n++;
swindow = XmCreateScrolledWindow (frame, "swindow", args, n);
XtManageChild (swindow);
n = 0;
XtSetArg (args[n], XmNpacking, XmPACK_NONE); n++;
XtSetArg (args[n], XmNorientation, XmVERTICAL); n++;
row_column = XmCreateRowColumn (swindow, "row_column", args, n);
XtManageChild (row_column);
/* Set MainWindow areas and add tab groups
*/
XmMainWindowSetAreas (main_window, menu_bar, NULL, NULL, NULL,
frame);
n = 0;
XtSetArg (args[n], XmNhorizontalScrollBar, &hsb); n++;
XtSetArg (args[n], XmNverticalScrollBar, &vsb); n++;
XtGetValues (main_window, args, n);
if (hsb) XmAddTabGroup (hsb);
if (vsb) XmAddTabGroup (vsb);
XmAddTabGroup (row_column);
return(main_window);
}
/* -------------------------------------------------------------
Dialog Box Creation Functions:
Help(char message[]);
FileSelect(char dir[]);
StringBox(char title[]);
------------------------------------------------------------- */
/*-------------------------------------------------------------
** CreateHelp - create help window
*/
Widget CreateHelp (message)
char message[];
{
Widget knopf;
Widget message_box; /* Message Dialog */
Arg args[20]; /* arg list */
register int n; /* arg count */
XmString title_string = NULL;
XmString message_string = NULL;
XmString knopf_string = NULL;
message_string = XmStringCreateLtoR (message, XmSTRING_DEFAULT_CHARSET);
knopf_string = XmStringCreateLtoR ("Close", XmSTRING_DEFAULT_CHARSET);
title_string = XmStringCreateLtoR ("Message:", XmSTRING_DEFAULT_CHARSET);
/* Create MessageBox dialog.
*/
n = 0;
XtSetArg (args[n], XmNdialogTitle, title_string); n++;
XtSetArg (args[n], XmNokLabelString, knopf_string); n++;
XtSetArg (args[n], XmNmessageString, message_string); n++;
message_box = XmCreateMessageDialog (main_window, "helpbox", args, n);
knopf = XmMessageBoxGetChild (message_box, XmDIALOG_CANCEL_BUTTON);
XtUnmanageChild (knopf);
knopf = XmMessageBoxGetChild (message_box, XmDIALOG_HELP_BUTTON);
XtUnmanageChild (knopf);
/* Free strings and return MessageBox.
*/
if (title_string) XtFree (title_string);
if (message_string) XtFree (message_string);
if (knopf_string) XtFree (knopf_string);
return (message_box);
}
Help(message)
char message[];
{
Widget w;
w = CreateHelp(message);
XtManageChild(w);
}
/*-------------------------------------------------------------
** CreateStringBox - create string input window
*/
Widget CreateStringBox (title)
char title[];
{
Widget knopf;
Arg args[20]; /* arg list */
register int n; /* arg count */
XmString title_string = NULL;
title_string = XmStringCreateLtoR (title, XmSTRING_DEFAULT_CHARSET);
/* Create MessageBox dialog.
*/
n = 0;
XtSetArg (args[n], XmNdialogTitle, title_string); n++;
dialog_box = (Widget) XmCreatePromptDialog (main_window, "stringbox", args, n);
XtAddCallback (dialog_box, XmNokCallback,activateCB, -1);
/* Free strings and return MessageBox.
*/
if (title_string) XtFree (title_string);
return (dialog_box);
}
/* TRICK TRICK TRICK TRICK TRICK TRICK TRICK TRICK TRICK TRICK TRICK TRICK
Since Xwindows only works from within the XtMainloop (building boxes,
watching mouse actions ...) it seemd to be impossible to write
JUST a function, which returns anything from a box, and then continues
with the program. The only way around this is a very dirty trick:
we store the address of our function with setjmp before giving controll
to XtMainloop, and after processing in our callback routine, longjmp
goes back to were we started.
TRICK TRICK TRICK TRICK TRICK TRICK TRICK TRICK TRICK TRICK TRICK TRICK */
StringBox(message,rtstr)
char message[],rtstr[];
{
Widget w;
w = CreateStringBox(message);
if(setjmp(ugly)==0) {
XtManageChild(w);
XtAppMainLoop (app_context);
} else {
strcpy(rtstr,return_string);
}
}
/*-------------------------------------------------------------
** CreateFileSelect - create file selection window
*/
Widget CreateFileSelect (dir)
char dir[];
{
Widget knopf;
Arg args[10]; /* arg list */
register int n; /* arg count */
XmString title_string = NULL;
title_string = XmStringCreateLtoR (dir, XmSTRING_DEFAULT_CHARSET);
/* Create MessageBox dialog.
*/
n = 0;
XtSetArg (args[n], XmNdialogTitle, title_string); n++;
dialog_box = (Widget) XmCreateFileSelectionDialog (main_window,
"fsel_box", args, n);
XtAddCallback (dialog_box, XmNokCallback,activateCB, -1);
knopf = (Widget) XmFileSelectionBoxGetChild (dialog_box, XmDIALOG_HELP_BUTTON);
XtUnmanageChild (knopf);
/* Free strings and return MessageBox.
*/
if (title_string) XtFree (title_string);
return (dialog_box);
}
FileSelect(message,rtstr)
char message[],rtstr[];
{
Widget w;
w = CreateFileSelect(message);
if(setjmp(ugly)==0) {
XtManageChild(w);
XtAppMainLoop (app_context);
} else {
strcpy(rtstr,return_string);
}
}
/* -------------------------------------------------------------------
look for altered variables and assotiated gadgets, Update Gadgets
(Writes back altered wariables to Gadgets)
------------------------------------------------------------------- */
UpdateGadgets() /* NEW! */
{
int n,m,i;
/* first set all toggle buttons */
for(n=0;n<toggle_ptr;n++) {
m=toggle_var[n];
i = *var_value[m];
XmToggleButtonGadgetSetState(Wtoggle[n],i);
}
/* now set all sliders */
for(n=0;n<scale_ptr;n++) {
m=scale_var[n];
i = *var_value[m];
XmScaleSetValue(Wscale[n],i);
}
/* now set all strings */
for(n=0;n<string_ptr;n++) {
m=string_var[n];
XmTextSetString(Wstring[n],var_value[m]);
}
}
/* -------------------------------------------------------------
add an item to the menu list
------------------------------------------------------------- */
add_item(x,y,type,text,p1,p2)
int x,y,type,p1,p2;
char text[];
{
int i,m;
Widget button;
Widget knopf;
XmString label_string;
Arg args[10]; /* arg list */
register int n; /* arg count */
char s1[80];
XmString item[80];
var_funct[fn_number] = type;
/* check, if position has to be adjusted */
if(x != -1) acc_x = x;
if(y != -1) acc_y = y;
/* do string parsing for SELECTION box */
extract_str(s1,text,0,',');
label_string =
XmStringCreateLtoR(s1, XmSTRING_DEFAULT_CHARSET);
n = 0;
XtSetArg (args[n], XmNlabelString, label_string); n++;
i=1; m=1;
while(m>0) {
m = extract_str(s1,text,i,',');
if(strlen(s1)==0) break;
item[i-1] = XmStringCreateLtoR(s1,XmSTRING_DEFAULT_CHARSET);
i++;
}
item[i-1] = NULL;
/* set position */
XtSetArg (args[n], XmNx,acc_x); n++;
XtSetArg (args[n], XmNy,acc_y); n++;
switch(type) {
case PUSH:
XtSetArg (args[n], XmNlabelType, XmSTRING); n++;
button = XmCreatePushButtonGadget(row_column,text , args, n);
XtAddCallback (button, XmNactivateCallback,
activateCB, (caddr_t)fn_number);
acc_y = acc_y + (8 * bas_y);
break;
case TOGGLE:
if(radio==NULL) radio = row_column;
button = XmCreateToggleButtonGadget(radio,text , args, n);
toggle_var[toggle_ptr] = fn_number;
Wtoggle[toggle_ptr++] = button;
acc_y = acc_y + (5 * bas_y);
break;
case SCALEX:
XtSetArg (args[n], XmNtitleString, label_string); n++;
XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++;
XtSetArg (args[n], XmNshowValue, True); n++;
XtSetArg (args[n], XmNminimum,p1); n++;
XtSetArg (args[n], XmNmaximum,p2); n++;
button = XmCreateScale(row_column,text , args, n);
scale_var[scale_ptr] = fn_number;
Wscale[scale_ptr++] = button;
acc_y = acc_y + (15 * bas_y);
break;
case SCALEY:
XtSetArg (args[n], XmNtitleString, label_string); n++;
XtSetArg (args[n], XmNorientation, XmVERTICAL); n++;
XtSetArg (args[n], XmNshowValue, True); n++;
XtSetArg (args[n], XmNminimum,p1); n++;
XtSetArg (args[n], XmNmaximum,p2); n++;
button = XmCreateScale(row_column,text , args, n);
scale_var[scale_ptr] = fn_number;
Wscale[scale_ptr++] = button;
acc_y = acc_y + (30 * bas_y);
break;
case SCALEY11:
XtSetArg (args[n], XmNtitleString, label_string); n++;
XtSetArg (args[n], XmNorientation, XmVERTICAL); n++;
XtSetArg (args[n], XmNshowValue, True); n++;
XtSetArg (args[n], XmNminimum,p1); n++;
XtSetArg (args[n], XmNmaximum,p2); n++;
XtSetArg (args[n], XmNheight,(p2-p1)); n++;
button = XmCreateScale(row_column,text , args, n);
scale_var[scale_ptr] = fn_number;
Wscale[scale_ptr++] = button;
acc_y = acc_y + (30 * bas_y);
break;
case SCALEX11:
XtSetArg (args[n], XmNtitleString, label_string); n++;
XtSetArg (args[n], XmNorientation, XmHORIZONTAL); n++;
XtSetArg (args[n], XmNshowValue, True); n++;
XtSetArg (args[n], XmNminimum,p1); n++;
XtSetArg (args[n], XmNmaximum,p2); n++;
XtSetArg (args[n], XmNwidth,(p2-p1)); n++;
button = XmCreateScale(row_column,text , args, n);
scale_var[scale_ptr] = fn_number;
Wscale[scale_ptr++] = button;
acc_y = acc_y + (15 * bas_y);
break;
case SELECTION:
XtSetArg (args[n], XmNtitleString, label_string); n++;
XtSetArg (args[n], XmNlistLabelString, label_string); n++;
XtSetArg (args[n], XmNminimizeButtons,True); n++;
XtSetArg (args[n], XmNlistItemCount,i-1); n++;
XtSetArg (args[n], XmNlistItems,item); n++;
button = XmCreateSelectionBox(row_column,text , args, n);
knopf = XmMessageBoxGetChild (button, XmDIALOG_CANCEL_BUTTON);
XtUnmanageChild (knopf); /* get rid of unneeded buttons */
XtAddCallback (button, XmNokCallback,
activateCB, (caddr_t)fn_number);
selector[selector_ptr++] = fn_number;
acc_y = acc_y + (75 * bas_y);
break;
case RADIO:
radio = (Widget) XmCreateRadioBox(row_column,text, args, n);
XtManageChild (radio);
return(0);
break;
case FILE_SELECT:
XtSetArg (args[n], XmNtitleString, label_string); n++;
XtSetArg (args[n], XmNlistLabelString, label_string); n++;
button = (Widget) XmCreateFileSelectionBox(row_column,text , args, n);
knopf = (Widget) XmFileSelectionBoxGetChild (button, XmDIALOG_CANCEL_BUTTON);
XtUnmanageChild (knopf); /* get rid of unneeded buttons */
knopf = (Widget) XmFileSelectionBoxGetChild (button, XmDIALOG_HELP_BUTTON);
XtUnmanageChild (knopf);
XtAddCallback (button, XmNokCallback,
activateCB, (caddr_t)fn_number);
selector[selector_ptr++] = fn_number;
acc_y = acc_y + (90 * bas_y);
break;
case STRING:
XtSetArg (args[n], XmNtitleString, label_string); n++;
XtSetArg (args[n], XmNeditable, True); n++;
XtSetArg (args[n], XmNeditMode, XmSINGLE_LINE_EDIT); n++;
XtSetArg (args[n], XmNscrollVertical, False); n++;
XtSetArg (args[n], XmNscrollHorizontal, False); n++;
button = (Widget) XmCreateScrolledText(row_column,text , args, n);
XtAddCallback (button, XmNactivateCallback,
activateCB, (caddr_t)fn_number);
string_var[string_ptr] = fn_number;
Wstring[string_ptr++] = button;
acc_y = acc_y + (15 * bas_y);
break;
case MENU:
button = XmCreatePushButton (menu_pane, label_string, args, n);
XtAddCallback (button, XmNactivateCallback,
activateCB, (caddr_t)fn_number);
break;
case NEW_MENU:
n = 0;
label_string =
XmStringCreateLtoR(menu_name, XmSTRING_DEFAULT_CHARSET);
XtSetArg (args[n], XmNlabelString, label_string); n++;
XtSetArg (args[n], XmNsubMenuId, menu_pane); n++;
XtSetArg(args[n], XmNlabelString,
label_string);
cascade = XmCreateCascadeButton (menu_bar,label_string,args,n);
XtManageChild (cascade);
n = 0;
menu_pane = XmCreatePulldownMenu (menu_bar, "menu_pane", args, n);
strcpy(menu_name,text);
return(0);
break;
default:
return(0);
break;
}
/* start managing button */
XtManageChild(button);
}
/*-------------------------------------------------------------
** activateCB - callback for button
*/
void activateCB (w, client_data, call_data)
Widget w; /* widget id */
caddr_t client_data; /* data from application */
caddr_t call_data; /* data from widget class */
{
int fn;
int n,m,i;
char *cbstr;
char rtstr[80];
/* first read all toggle buttons */
for(n=0;n<toggle_ptr;n++) {
i=XmToggleButtonGadgetGetState(Wtoggle[n]);
m=toggle_var[n];
*var_value[m] = i;
}
/* now read all sliders */
for(n=0;n<scale_ptr;n++) {
XmScaleGetValue(Wscale[n],&i);
m=scale_var[n];
*var_value[m] = i;
}
/* now read all strings */
for(n=0;n<string_ptr;n++) {
m=string_var[n];
cbstr = (char *) XmTextGetString(Wstring[n]);
strcpy(var_value[m],cbstr);
XtFree(cbstr);
}
fn = (int) client_data;
last_gadgetid = fn;
/* process callback from dialog box */
if(fn<0) {
{
XmSelectionBoxCallbackStruct *scb =
(XmSelectionBoxCallbackStruct *) call_data;
XmStringGetLtoR(scb->value, XmSTRING_DEFAULT_CHARSET, &cbstr);
}
strcpy(return_string,cbstr);
XtUnmanageChild(dialog_box);
longjmp(ugly,1);
}
/* if call from selection box, the catch string */
for(n=0;n<selector_ptr;n++) {
if(selector[n] == fn) {
{
XmSelectionBoxCallbackStruct *scb =
(XmSelectionBoxCallbackStruct *) call_data;
XmStringGetLtoR(scb->value, XmSTRING_DEFAULT_CHARSET, &cbstr);
strcpy(var_value[fn],cbstr);
}
}
}
(*fn_command[fn])();
UpdateGadgets();
}
dummy()
{
return(0);
}
/* !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Dummy functions for amiga compatibility
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! */
Refresh1Gadget(i)
int i;
{
return;
}
DrawAllPropBorders(i)
int i;
{
return;
}
set_new_pointer()
{
return;
}
set_old_pointer()
{
return;
}
RequestYesNo(s)
char *s;
{
return(0);
}
/* ********************************************************************
S T R I N G H A N D L I N G
******************************************************************** */
/* --------------------------------------------------
reurns in s1 s2 from nth occurence of c up to c
-------------------------------------------------- */
extract_str(s1,s2,n,c)
char s1[],s2[],c;
int n;
{
int m,i,l;
char c1;
m=0; l=strlen(s2);
i = 0;
if(n > 0) {
for(i=0;i<l;i++) {
c1=s2[i];
if(c1 == c) m++;
if(m == n) break;
}
s1[0] = 0;
if(c1 != c) return(-1);
i++;
}
m=0;
while(i<l) {
c1 = s2[i++];
if(c1 == c) break;
s1[m++] = c1;
}
s1[m] = 0;
if(strlen(s1)==0) return(-1);
return(1);
}